package com.th.coupon.gateway.filter;


import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import com.th.coupon.common.vo.ResultData;

/**
 * 在ZuulFilter下的一层抽象
 * @author 涂航
 */
public abstract class AbstractZuulFilter extends ZuulFilter {
    /**
     * 过滤器之间传递的上下文对象
     */
    RequestContext context;

    private final String NEXT = "NEXT";

    @Override
    public boolean shouldFilter() {
        RequestContext currentContext = RequestContext.getCurrentContext();
        return (Boolean)currentContext.getOrDefault(NEXT,true);
    }

    @Override
    public Object run() throws ZuulException {
        this.context = RequestContext.getCurrentContext();
        return cRun(this.context);
    }

    /**
     * 过滤逻辑执行的模板方法，由子类实现
     * @param context
     * @return
     */
    protected abstract Object cRun(RequestContext context);


    /**
     * 定义失败返回方法
     * @param code
     * @param msg
     * @return
     */
    Object fail(int code,String msg){
        context.set(NEXT,false);
        //设置不需要再执行其他的程序逻辑，以及过滤器，直接程序返回
        context.setSendZuulResponse(false);
        //设置程序响应 响应错误信息
        context.getResponse().setContentType("text/html;charset=UTF-8");
        //响应码
        context.setResponseStatusCode(code);
        //响应内容
        context.setResponseBody(String.format(
                "{\"result\":\"%s!\"}",msg
        ));
        return null;
    }

    /**
     * 定义失败返回方法
     * @param resultData 响应参数
     * @return
     */
    Object fail(ResultData resultData){
        context.set(NEXT,false);
        //设置不需要再执行其他的程序逻辑，以及过滤器，直接程序返回
        context.setSendZuulResponse(false);
        //设置程序响应 响应错误信息
        context.getResponse().setContentType("text/html;charset=UTF-8");
        //响应码
        context.setResponseStatusCode(resultData.code());
        //响应内容
        context.setResponseBody(String.format(
                "{\"result\":\"%s!\"}",resultData.message()
        ));
        return null;
    }

    /**
     * 定义成功方法
     * @return
     */
    Object success(){
        context.set(NEXT,true);
        return null;
    }
}
